from Constantes import vetornotas, vetoracordes
import Analise

#Funcao responsavel pela construcao de dicionarios com os valores de notas ou acordes como chaves
#Parametros : tipos, pode ser 'notas' ou 'acordes'
#Retorna : um dicionario com os valores de notas ou acordes como chaves e 0 para cada item
def inicia_dict(tipo="notas"):
    if tipo=="notas":
        pesos = {Analise.Nota(None):0}
        for i in vetornotas:
            note = Analise.Nota(i)
            pesos.update({note:0})
    else:
        pesos = {vetoracordes[0]:0}
        for i in vetoracordes:
            pesos.update({i:0})
    return pesos

#Uma adaptacao da busca binaria para se trabalhar em uma escala logaritmica de frequencias
#Parametros :lista, uma lista ordenada 
#           valor, o valor procurado
#           erro , o erro permitido  
#Retorna: O local em que a frequencia aproximada foi encontrada, ou -1 se nao encontrar nenhuma frequencia dentro do erro permitido
def buscaFreq(lista,valor,erro=1):
    index = -1
    i=0
    while  i < len(lista)-1 and not (valor <= lista[i]*erro and valor >= lista[i]/erro):
        i +=1
    if valor <= lista[i]*erro and valor >= lista[i]/erro :
        index = i
    return index

#Calcula a diferenca entre os valores n e n-1 dos m-1 valores de um vetor com comprimento m
#Parametros: vetor, uma lista de valores numericos
#Retorna: um vetor com vetor[x]=vetor[n]-vetor[n-1] para len(vetor)-1 valores
def diferencas(vetor):
    delta = [vetor[n] - vetor[n-1] for n in range(1,len(vetor))]
    return delta

#Calcula uma derivada aproximada de uma funcao
#Parametros: eixox , o dominio da funcao
#            eixoy, a imagem da funcao
#Retorna: um vetor com len(eixox)-1 valores contendo a derivada aproximada da funcao
def derivadadif(eixox,eixoy):
    deltay = diferencas(eixoy)
    deltax = diferencas(eixox)
    derivada = [deltay[k] /  deltax[k] for k in range(len(deltax))]
    return derivada

#Calcula a maior ocorrencia de um item em um dicionario de contagem
#Parametros: um dicionario, como o construido no histograma de notas
def maior_item(dicionario):
    maximo=0
    for item in dicionario:
        if dicionario[item] >= maximo:
            item_maximo=item
            maximo=dicionario[item]
    return item_maximo
